using System;
using Sinacor.Servico.Bovespa.Cliente;
using System.Collections.Generic;
using System.ComponentModel;

namespace Sinacor.Servico.Bovespa.Cliente.Service.ServiceImplementation.Translator
{
    public static class TranslateBetweenClienteResponseAndCliente
    {
        public static Sinacor.Servico.Bovespa.Cliente.Service.DataContract.Response.ClienteResponse TranslateClienteToClienteResponse(BusinessEntity.Cliente from)
        {
            DataContract.Response.ClienteResponse to = new DataContract.Response.ClienteResponse();
            to.Codigo = from.Codigo;
            to.DigitoVerificador = from.Digito;
            to.Apelido = from.Apelido;
            to.Nome = from.Nome;
            to.NomeResumido = from.NomeResumido;
            to.ComplementoNome = from.ComplementoNome;
            to.ClienteContaInvestimento = from.ClienteContaInvestimento;
            to.CPFCNPJ = from.CPFCNPJ;
            if (from.CPFCNPJ.HasValue)
                to.CPFCNPJTexto = from.CPFCNPJ.Value.ToString(); //Incluido CPFCNPJTexto para contornar erro na exportacao do DataGrid para Excel - esertorio - 200805132318 - ref issue ID0004794
            to.DataNascimentoFundacao = from.DataNascimentoFundacao;
            to.Dependencia = from.Dependencia;
            //to.ContaMae = from.ContaMae; //Excluido - Eduardo Sertorio e Ludmilla Modesto - 20080103
            to.CodigoOperacionalCVM = from.CodigoOperacionalCVM;
            to.isClienteQualificado = from.isClienteQualificado;
            to.Origem = from.Origem;
            to.Assessor = from.Assessor;
            to.ContaMae = from.ContaMae; 
            to.TransmissaoOrdem = (DataContract.Enum.TipoTransmissaoOrdem?) from.TransmissaoOrdem;
            to.Situacao = (DataContract.Enum.TipoSituacao?) from.Situacao;
            to.ClienteBroker = from.CodigoClienteBroker; //Equivalente ContaMae - 20080103 - TSCCLIBOL.CD_CLIENTE_LIQFIN 
            to.isPessoaVinculada = from.isPessoaVinculada;

            to.PosicaoContasCorrente = Translator.
                TranslateBetweenPosicaoContasCorrenteResponseAndPosicaoContasCorrente.
                TranslatePosicaoContasCorrenteToPosicaoContasCorrenteResponse(from.PosicaoContasCorrente);

            to.PosicaoCustodia = Translator.
                TranslateBetweenPosicaoCustodiaResponseAndPosicaoCustodia.
                TranslatePosicaoCustodiaToPosicaoCustodiaResponse(from.PosicaoCustodia);

            to.BancoContaCorrente = Translator.
                TranslateBetweenContaBancoResponseAndDadosBancarios.
                TranslateDadosBancariosToContaBancoResponse(from.BancoContaCorrente);

            to.BancoDividendo = Translator.
                TranslateBetweenContaBancoResponseAndDadosBancarios.
                TranslateDadosBancariosToContaBancoResponse(from.BancoDividendo);

            if ((from.LimitesOperacionais != null) && (from.LimitesOperacionais.Count != 0))
            {
                to.LimitesOperacionais = new List<System.Decimal>();
                foreach (System.Decimal itemFrom in from.LimitesOperacionais)
                {
                    to.LimitesOperacionais.Add(itemFrom);
                }
            }

            if ((from.Endereco != null) && (from.Endereco.Count != 0))
            {
                to.Endereco = new List<DataContract.Response.EnderecoResponse>();
                foreach (BusinessEntity.Endereco beEndereco in from.Endereco)
                {
                    to.Endereco.Add(Translator.TranslateBetweenEnderecoAndEnderecoResponse.
                    TranslateEnderecoToEnderecoResponse(beEndereco));
                }
            }

            if ((from.Telefone != null) && (from.Telefone.Count != 0))
            {
                to.Telefone = new List<DataContract.Response.TelefoneResponse>();
                foreach (BusinessEntity.Telefone beTelefone in from.Telefone)
                {
                    to.Telefone.Add(Translator.TranslateBetweenNumeroTelefoneResponseAndNumeroTelefone.
                        TranslateNumeroTelefoneToNumeroTelefoneResponse(beTelefone));
                }
            }

            if (from.Bloqueio != null)
            {
                to.TipoBloqueio = from.Bloqueio.TipoBloqueio;
                to.DescricaoBloqueio = from.Bloqueio.DescricaoBloqueio;
                to.isBloqueado = from.Bloqueio.isBloqueado;
            }

            to.TipoLiquidacao = (DataContract.Enum.TipoLiquidacao?) from.TipoLiquidacao; //Incluido - Eduardo Sertorio - 20070103
            to.PercentualReducaoAcrescimo = from.PercentualReducaoAcrescimo; //Incluido - Eduardo Sertorio - 20070103
            to.CodigoClienteInstitucional = from.CodigoClienteInstitucional; //Incluido - Eduardo Sertorio - 20080111
            to.PercentualTotal = from.PercentualTotal; //Incluido - Eduardo Sertorio - 20080111
            to.isClienteQualificado = from.isClienteQualificado; //Incluido - Eduardo Sertorio - 20080111
            to.isOperacaoCarteiraCliente = from.isOperacaoCarteiraCliente; //Incluido - Eduardo Sertorio - 20080111
            to.CodigoCarteira = from.Carteira; //Incluido - Eduardo Sertorio - 20080212

            to.isClienteBroker = from.isClienteBroker; //incluido para indicar Tipo de Ordem Financiamento - esertorio - 200804161636 - ref issue ID0003219

            //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
            to.DigitoClienteContaInvestimento = from.DigitoClienteContaInvestimento;
            //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
            to.ClienteContaDeposito = from.ClienteContaDeposito;
            //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
            to.DigitoClienteContaDeposito = from.DigitoClienteContaDeposito;
            //20080421 16:38 - Adicionado para atender ao chamado 3063 - DMilanez.7Comm
            to.IsContaInvestimento = from.IsContaInvestimento;
            
            //20081017 - RSCATULIN
            to.IsAdministradoConcorrente = from.IsAdministradoConcorrente;

            return to;
        }

        public static List<DataContract.Response.ClienteResponse>
            TranslateClienteCollectionClienteResponseCollection(List<BusinessEntity.Cliente> from)
        {
            List<DataContract.Response.ClienteResponse> to = null;

            if (from != null)
            {
                to = new List<DataContract.Response.ClienteResponse>();
                foreach (BusinessEntity.Cliente listaCliente in from)
                {
                    to.Add(TranslateBetweenClienteResponseAndCliente.
                        TranslateClienteToClienteResponse(listaCliente));
                }
            }

            return to;
        }
    }
}

